#ifndef VISTA_AEREA_H_
#define VISTA_AEREA_H_

#include "vista.h"
#include "camesferica.h"
#include "handler.h"
#include "vehiculo.h"

class VistaAerea : public Vista {
   private:
      CamEsferica camAerea;
      Vehiculo &vehiculo;

      void zoomInCamAerea() {
         if( camAerea.distancia() == 1) return;
         camAerea.distancia(camAerea.distancia() - 1);
      }

      void zoomOutCamAerea() {
         camAerea.distancia(camAerea.distancia() + 1);
      }

      void zoomCamAerea_keyboard(unsigned char key, int x, int y) {
         switch(key) { 
            case '-':
               zoomOutCamAerea();
               break;
            case '+':
               zoomInCamAerea();
               break;
         }
      }

      void moveCamArea( int x, int y, int deltaX, int deltaY) {
         if ((deltaX<40)&&(deltaY<40)){
            camAerea.longitud( camAerea.longitud() + (deltaX) / 3.0 );
          
            camAerea.latitud( camAerea.latitud() + (deltaY) / 3.0 );

            if(camAerea.latitud() <= 5) camAerea.latitud(5);
            if(camAerea.latitud() >= 90) camAerea.latitud(90);
         }
      }

      void zoomCamArea_mouse(int boton,int estado,int x, int y){
         enum {
            MOUSE_SCROLL_UP = 3,
            MOUSE_SCROLL_DOWN = 4
         };

         if (boton==MOUSE_SCROLL_UP)
            zoomInCamAerea();
         if (boton==MOUSE_SCROLL_DOWN)
            zoomOutCamAerea();
      }

   public:
      VistaAerea(Handler& handler, Vehiculo &vehiculo, int anchoMapa, int altoMapa) :
         camAerea(1, 0, 0, 0, 0, 1), vehiculo(vehiculo) {
            // CamEsferica , con plano rotacional del ecuador igual 
            // al plano xy
            camAerea.distancia(15);

            // Definimos una elevacion respecto al plano del ecuador: 
            //      latitud = 45 grados
            // Rotamos respecto al eje principal:
            //      longitud = 45 grados
            camAerea.latitud(45);
            camAerea.longitud(45);

            camAerea.x(anchoMapa / 2.0);
            camAerea.y(altoMapa / 2.0);
            camAerea.z(0);

            Acciones::agregar(handler.signal_keyDown().connect(sigc::mem_fun(*this, &VistaAerea::zoomCamAerea_keyboard)));
            Acciones::agregar(handler.signal_move().connect(sigc::mem_fun(*this, &VistaAerea::moveCamArea)));
            Acciones::agregar(handler.signal_mouse().connect(sigc::mem_fun(*this, &VistaAerea::zoomCamArea_mouse)));

            Acciones::agregar(handler.signal_specialkey().connect(sigc::mem_fun(vehiculo, &Vehiculo::control)));
         }

      void ver() const {
         camAerea.ver();
      }
};

#endif
